package br.com.expositor.apresentacao.infra.imp;

import java.io.Serializable;

import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.panel.FeedbackPanel;

import br.com.expositor.negocios.infra.entidade.IEntidade;
import br.com.expositor.negocios.infra.exception.ExpositorException;

public abstract class PaginaCadastroGenerica<ENTIDADE extends IEntidade, ID extends Serializable>
		extends PaginaEntidadeGenerica<ENTIDADE> {

	private FeedbackPanel feedbackPanel;

	public PaginaCadastroGenerica(ENTIDADE entidade) {
		this(entidade, null);
	}

	public PaginaCadastroGenerica(ENTIDADE entidade,
			PaginaGenerica paginaGenerica) {
		super(entidade, paginaGenerica);
	}

	public abstract void acaoSalvar(AjaxRequestTarget target);

	public void acaoVoltar() {
		if (this.getPaginaRetorno() != null) {
			this.setResponsePage(this.getPaginaRetorno());
		}
	}

	public abstract void criarBotoesManutencao(Form<Component> form);

	public FeedbackPanel getFeedbackPanel() {
		return this.feedbackPanel;
	}

	public abstract String getNomeEntidade();

	@Override
	public void montarPagina() {
		// painel de mensagens
		this.feedbackPanel = new FeedbackPanel("mensagensCadastro");
		this.feedbackPanel.setOutputMarkupId(true);

		this.add(this.feedbackPanel);
		this.add(new Label("tituloCadastro", "Cadastro "
				+ this.getNomeEntidade()));
	}

	public abstract void paginaVisualizar();

	public abstract void salvarEntidade();

	public void setFeedbackPanel(FeedbackPanel feedbackPanel) {
		this.feedbackPanel = feedbackPanel;
	}

	protected void showConfirmPopUp(AjaxRequestTarget target) {
		ModalWindow modalWindow = (ModalWindow) this.get("modalwindow");
		modalWindow.show(target);
	}

	public void tratarException(Exception erro) {
		this.tratarException(erro, null);
	}

	public void tratarException(Exception erro, AjaxRequestTarget target) {
		if (erro instanceof ExpositorException) {
			ExpositorException erroExpo = (ExpositorException) erro;
			if ((erroExpo.getErros() != null)
					&& (erroExpo.getErros().size() > 0)) {
				for (ExpositorException erroObt : erroExpo.getErros()) {
					this.error(erroObt.getMessage());
				}
			} else {
				this.error(erroExpo.getMessage());
			}
		} else {
			this.error(erro.getMessage());
		}
		if (target != null) {
			target.add(this.getFeedbackPanel());
		}

	}

}
